let n;
let cacheMax;
let orgMap;
let map;

/**
 * .x..
 * ....
 * xx..
 * ....
 */
function isCanAdd(x, y, list) {
    let str = list[x];
    if (str[y] != '.') {
        return false;
    }
    let isLeftStore = false;
    let isRightStore = false;
    let isUpStore = false;
    let isBottomStore = false;
    for (let i = 1; i < n; i++)
    {
        if (y - i >= 0 && !isLeftStore)
        {
            let left = str[y - i];
            if (left == 'o') {
                return false;
            }
            if (left == 'X') {
                isLeftStore = true;
            }
        }

        if (y + i < n && !isRightStore)
        {
            let right = str[y + i];
            if (right == 'o')
            {
                return false;
            }
            if (right == 'X')
            {
                isRightStore = true;
            }
        }

        if (x - i >= 0 && !isUpStore)
        {
            let up = list[x - i][y];
            if (up == 'o')
            {
                return false;
            }
            if (up == 'X')
            {
                isUpStore = true;
            }
        }

        if (x + i < n && !isBottomStore)
        {
            let bottom = list[x + i][y];
            if (bottom == 'o')
            {
                return false;
            }
            if (bottom == 'X')
            {
                isBottomStore = true;
            }
        }
        if (isRightStore && isLeftStore && isRightStore && isLeftStore)
        {
            break;
        }
    }
    return true;
}

function dfs(startX, startY)
{
    let m = 0;
    for (let y = startY; y < n; y++)
    {
        for (let x = startX; x < n; x++)
        {
            if (isCanAdd(x, y, map))
            {
                map[x][y] = 'o';
                m++;
                m += dfs(x+1, y+1);
                map[x][y] = orgMap[x][y];
            }
        }
    }
    if (m > cacheMax)
    {
        cacheMax = m;
    }
    return m;
}
cacheMax = 0;
n = 2;
orgMap = ['XX', '.x'];
map = ['XX', '.x'];
dfs(0, 0)
// function main()
// {
//     while (cin >> n)
//     {
//         string *orgMap = new string[n];
//         string *map = new string[n];
//         for (int i = 0; i < n; i++)
//         {
//             cin >> orgMap[i];
//             map[i] = orgMap[i];
//         }
//         dfs(0, 0);
//         cout << cacheMax << endl;
//         delete[] orgMap;
//         delete[] map;
//     }

//     return 0;
// }